package com.mqbest.whome;

import org.jivesoftware.smack.Connection;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.provider.PrivacyProvider;
import org.jivesoftware.smack.provider.ProviderManager;
import org.jivesoftware.smackx.GroupChatInvitation;
import org.jivesoftware.smackx.PrivateDataManager;
import org.jivesoftware.smackx.bytestreams.socks5.provider.BytestreamsProvider;
import org.jivesoftware.smackx.packet.ChatStateExtension;
import org.jivesoftware.smackx.packet.LastActivity;
import org.jivesoftware.smackx.packet.OfflineMessageInfo;
import org.jivesoftware.smackx.packet.OfflineMessageRequest;
import org.jivesoftware.smackx.packet.SharedGroupsInfo;
import org.jivesoftware.smackx.provider.AdHocCommandDataProvider;
import org.jivesoftware.smackx.provider.DataFormProvider;
import org.jivesoftware.smackx.provider.DelayInformationProvider;
import org.jivesoftware.smackx.provider.DiscoverInfoProvider;
import org.jivesoftware.smackx.provider.DiscoverItemsProvider;
import org.jivesoftware.smackx.provider.MUCAdminProvider;
import org.jivesoftware.smackx.provider.MUCOwnerProvider;
import org.jivesoftware.smackx.provider.MUCUserProvider;
import org.jivesoftware.smackx.provider.MessageEventProvider;
import org.jivesoftware.smackx.provider.MultipleAddressesProvider;
import org.jivesoftware.smackx.provider.RosterExchangeProvider;
import org.jivesoftware.smackx.provider.StreamInitiationProvider;
import org.jivesoftware.smackx.provider.XHTMLExtensionProvider;
import org.jivesoftware.smackx.search.UserSearch;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class LoginActivity extends Activity implements OnClickListener{
	private Button LoginButton;
	private EditText UserNameEt;
	private EditText PasswordEt;
	private String strUsername, strPw;
	
	private ProgressDialog proDialog;
	
	XMPPConnection ConnCtx = null;
	private LomoCtx LomoCtx = null;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_login);
		LomoCtx = new LomoCtx();
		InitView();
	}
	
	private void InitView(){
		UserNameEt = (EditText)findViewById(R.id.username_et);
		PasswordEt = (EditText)findViewById(R.id.pw_et);
		LoginButton = (Button)findViewById(R.id.login_btn);
		LoginButton.setOnClickListener(this);
		String strTestUser = "xssl2001";
		String strTestPw = "n3tacc355";
		UserNameEt.setText(strTestUser.toCharArray(), 0, strTestUser.length());
		PasswordEt.setText(strTestPw.toCharArray(), 0, strTestPw.length());
	}

	@Override
	public void onClick(View arg0) {
		// TODO Auto-generated method stub
		int viewId = arg0.getId();
		switch(viewId){
		case R.id.login_btn:
			strUsername = UserNameEt.getText().toString().trim();
			strPw = PasswordEt.getText().toString().trim();
			if(!"".equals(strUsername) && !"".equals(strPw)){
				proDialog = ProgressDialog.show(LoginActivity.this, getString(R.string.login_note), getString(R.string.conn_note), true, true);
				Thread loginThread = new Thread(new XmppLoginRun());
				loginThread.start();	
			}
			break;
		}
	}
	
	class XmppLoginRun implements Runnable{
		
		boolean bLoginStat = false;
		String strHost = "xmpp.l.google.com";
		String strUserID = strUsername+"@gmail.com";
		@Override
		public void run() {
			
			try {
				ConnectionConfiguration config=new ConnectionConfiguration(strHost, 5222);
				//config .setTruststorePath("/download/cacerts.bks");
				//config.setTruststorePassword("changeit");
				//config.setTruststoreType("bks");
				config.setSASLAuthenticationEnabled(true);
				config.setDebuggerEnabled(true);
				config.setCompressionEnabled(true);
				Connection.DEBUG_ENABLED=true;

				ConnCtx = new XMPPConnection(config);
				ProviderManager pm=ProviderManager.getInstance();
				configurePM(pm);
				
				ConnCtx.connect();
				ConnCtx.login(strUserID, strPw);

				LomoCtx.setXmppCtx(ConnCtx);
				bLoginStat = true;
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			if(true == bLoginStat){
				heartbeatThread.start();
				
				Intent BuddyActIntent =new Intent(LoginActivity.this, CtxActivity.class);
				startActivity(BuddyActIntent);	
				overridePendingTransition(R.layout.a2, R.layout.a1);
				LoginActivity.this.finish();
				
			}else{
				LomoCtx.releaseXmppCtx();
			}
			
			if(null != proDialog){
				proDialog.dismiss();
			}
		}
	}
	
	Thread heartbeatThread=new Thread(new Runnable(){  
        int iTryInterval = 60, iSecond = 0;
        
        Presence presence = new Presence(Presence.Type.available);
        
        public void run()  
        {  
        	iSecond = iTryInterval;
        	try{
        		while(true){
        			Thread.sleep(1000);
                    if(iSecond == iTryInterval){
                    	ConnCtx.sendPacket(presence);
                    	iSecond = 0;
                    }
                    iSecond++;
        			if(ConnCtx.isSocketClosed()){
        				break;
        			}
        		}       		
        	}catch(Exception e){
        		e.printStackTrace();
        	}
        }  
    });  
	  
	public void configurePM(ProviderManager pm) {
		//  Private Data Storage  
		pm.addIQProvider("query","jabber:iq:private", new PrivateDataManager.PrivateDataIQProvider());  
		  
		//  Time  
		try {  
		    pm.addIQProvider("query","jabber:iq:time", Class.forName("org.jivesoftware.smackx.packet.Time"));  
		} catch (ClassNotFoundException e) {  
		    Log.w("TestClient", "Can't load class for org.jivesoftware.smackx.packet.Time");  
		}  
		  
		//  Roster Exchange  
		pm.addExtensionProvider("x","jabber:x:roster", new RosterExchangeProvider());  
		  
		//  Message Events  
		pm.addExtensionProvider("x","jabber:x:event", new MessageEventProvider());  
		  
		//  Chat State  
		pm.addExtensionProvider("active","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());  
		pm.addExtensionProvider("composing","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());   
		pm.addExtensionProvider("paused","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());  
		pm.addExtensionProvider("inactive","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());  
		pm.addExtensionProvider("gone","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());  
		  
		//  XHTML  
		pm.addExtensionProvider("html","http://jabber.org/protocol/xhtml-im", new XHTMLExtensionProvider());  
		  
		//  Group Chat Invitations  
		pm.addExtensionProvider("x","jabber:x:conference", new GroupChatInvitation.Provider());  
		  
		//  Service Discovery # Items      
		pm.addIQProvider("query","http://jabber.org/protocol/disco#items", new DiscoverItemsProvider());  
		  
		//  Service Discovery # Info  
		pm.addIQProvider("query","http://jabber.org/protocol/disco#info", new DiscoverInfoProvider());  
		  
		//  Data Forms  
		pm.addExtensionProvider("x","jabber:x:data", new DataFormProvider());  
		  
		//  MUC User  
		pm.addExtensionProvider("x","http://jabber.org/protocol/muc#user", new MUCUserProvider());  
		  
		//  MUC Admin      
		pm.addIQProvider("query","http://jabber.org/protocol/muc#admin", new MUCAdminProvider());  
		  
		//  MUC Owner      
		pm.addIQProvider("query","http://jabber.org/protocol/muc#owner", new MUCOwnerProvider());  
		  
		//  Delayed Delivery  
		pm.addExtensionProvider("x","jabber:x:delay", new DelayInformationProvider());  
		  
		//  Version  
		try {  
		    pm.addIQProvider("query","jabber:iq:version", Class.forName("org.jivesoftware.smackx.packet.Version"));  
		} catch (ClassNotFoundException e) {  
		    //  Not sure what's happening here.  
		}  
		  
		//  VCard  
		//pm.addIQProvider("vCard","vcard-temp", new VCardProvider());  
		  
		//  Offline Message Requests  
		pm.addIQProvider("offline","http://jabber.org/protocol/offline", new OfflineMessageRequest.Provider());  
		  
		//  Offline Message Indicator  
		pm.addExtensionProvider("offline","http://jabber.org/protocol/offline", new OfflineMessageInfo.Provider());  
		  
		//  Last Activity  
		pm.addIQProvider("query","jabber:iq:last", new LastActivity.Provider());  
		  
		//  User Search  
		pm.addIQProvider("query","jabber:iq:search", new UserSearch.Provider());  
		  
		//  SharedGroupsInfo  
		pm.addIQProvider("sharedgroup","http://www.jivesoftware.org/protocol/sharedgroup", new SharedGroupsInfo.Provider());  
		  
		//  JEP-33: Extended Stanza Addressing  
		pm.addExtensionProvider("addresses","http://jabber.org/protocol/address", new MultipleAddressesProvider());  
		  
		//   FileTransfer  
		pm.addIQProvider("si","http://jabber.org/protocol/si", new StreamInitiationProvider());  
		  
		pm.addIQProvider("query","http://jabber.org/protocol/bytestreams", new BytestreamsProvider());  
		  
		//  Privacy  
		pm.addIQProvider("query","jabber:iq:privacy", new PrivacyProvider());  
		pm.addIQProvider("command", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider());  
		pm.addExtensionProvider("malformed-action", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.MalformedActionError());  
		pm.addExtensionProvider("bad-locale", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.BadLocaleError());  
		pm.addExtensionProvider("bad-payload", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.BadPayloadError());  
		pm.addExtensionProvider("bad-sessionid", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.BadSessionIDError());  
		pm.addExtensionProvider("session-expired", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.SessionExpiredError());
	}
}